
const querystring = require("querystring");
const crypto = require('crypto');
const chalk = require('chalk')
const log = console.log
const fs = require('fs')

// 确定 app 的云 API 密钥
const secret_id = "";
const secret_key = "";
// 确定签名的当前时间和失效时间
const current = 1627801035971
const expired = current + 86400;  // 签名有效期：1天
// 向参数列表填入参数
const arg_list = {
  secretId: secret_id,
  currentTimeStamp: current,
  expireTime: expired,
  // random: Math.round(Math.random() * Math.pow(2, 32))
  random: 3
}

// 计算签名
// 1、参数变成 stringify
const orignal = querystring.stringify(arg_list);

log(chalk.blue('orignal', orignal))

// 2、 string 转成 buffer
const orignal_buffer = Buffer.from(orignal, "utf8");
log(chalk.red('orignal_buffer', orignal_buffer))

// 3. 使用 sha1 加密算法，传入防止篡改签名的key
// 使用 sha1 算法， 使用 secret_key 防止对签名进行篡改
const hmac = crypto.createHmac("sha1", secret_key);

// 4. 塞需要加密的数据
// 塞我们想要加密的数据, update 是塞数据的过程， digest 是结束塞数据，输出数据的过程， digest 没有指定编码， 输出的 就是 Buffter
const hmac_buffer = hmac.update(orignal_buffer).digest();

// 5. 加密数据输出 digest , 输出为 buffer

// 6. 拼接加密后的Buffer, 和加密前的buffer, 并使用 base64编码， 将 buffer 转成字符串
// Buffer.concat([hmac_buffer, orignal_buffer])  返回的还是一个 Buffer对象
// toString("base64");使用 base64进行编码处理， 并不是加密
const signature = Buffer.concat([hmac_buffer, orignal_buffer]).toString("base64");
console.log('原生node - 签名的结果')
// 拼接起来的样子
// secretId=AKIDMXS7XlkTwA9sPima8QSFm47uRikX4NRG&currentTimeStamp=1627801035971&expireTime=1627801122371&random=3

// j/gs+8BK1DMTycoYf8L4XGIFV2RzZWNyZXRJZD1BS0lETVhTN1hsa1R3QTlzUGltYThRU0ZtNDd1UmlrWDROUkcmY3VycmVudFRpbWVTdGFtcD0xNjI3ODAxMDM1OTcxJmV4cGlyZVRpbWU9MTYyNzgwMTEyMjM3MSZyYW5kb209Mw==
// 拿到这个参数和 腾讯测试页面（https://video.qcloud.com/signature/ugcgenerate.html） 做对比
console.log(signature);
